昨天我們學習BPMN參與者的概念,我們現在已經對BPMN的雛形有初步的了解,今天正式進入到BPMN的零部件學習階段,我們利用大概10分鐘的時間來學習BPMN中的零件「事件」吧。
事件(Event)在BPMN 2.0執行語義中扮演著極為重要的角色,指的是在流程運行過程中所發生的事情,而這些事情的發生會影響到流程的進行。每個事件通常包括兩個要素,分別是觸發該事件的原因以及其所導致的結果。
事件包含了開始(Start)、中間(Intermediate)和結束(End)三種類型,涵蓋了事件的啟動、結束、邊界條件,以及每個活動的創建、啟動和流轉等過程。透過事件機制,可以透過事件控制器為系統增加輔助功能,例如整合其他業務系統或活動預警等。
事件的圖形符號呈現為一個圓圈。
開始事件(Start Event)符號是空心圖形,代表著開始事件,代表某事的開始,或流程的啟動,促使第一個活動的執行。
(圖片來源:Business Process Model and Notation(BPMN))P246
中間事件(Intermediate Event)符號是兩個嵌套的圓圈,位於開始事件與結束事件之間,會影響事件或流程的進展,但不導致事件直接開始或結束。
(圖片來源:Business Process Model and Notation(BPMN))P250
結束事件(End Event)符號為實心圓,標誌著事件或流程的結束或終止。若它發生在參與者完成可能的活動序列後,通常會標記流程的業務目標達成。
(圖片來源:Business Process Model and Notation(BPMN))P272
💡 題外話:上述的事件類型在BPMN2.0中被歸類為None Event類別,屬於沒有定義的事件,詳細請參見:Business Process Model and Notation(BPMN))P272
「空白事件(None Events)」指的是未明確指定的事件。
舉例來說,「空白開始事件」表示啟動流程實例的觸發方式並未被具體指定,流程引擎無法預測流程實例必須何時被啟動。
空白事件流程範例1
(圖片來源:筆者自製,使用bpmn.io)
空白事件流程範例2
(圖片來源:筆者自製,使用bpmn.io)
定時器事件(Timer Event)用來在特定的日期、時間,或者週期內觸發事件。由預先設定的定時器所觸發的事件,可以用作開始事件、中間事件或者邊界事件,順帶一題,邊界事件可以是中斷式亦或是非中斷式的。
💡 定時器事件 舉例來說
在2023年9月18號00:00 觸發一個事件,事件是觸發鈴響,響鈴30秒後任務結束。
上述對倒數計時事件進行建模。我們需要將定時器事件(Timer Event)建模為附加定時器事件(Attached Timer Event)。可以設定任務的最大執行時間,一旦超時,就會中斷這個任務的執行,轉而執行定時器所觸發的事件。而定時器的事件大概可以分為以下三種型態:
中斷定時器事件和非中斷定時器事件之間有區別。中斷事件是預設的,會導致原始活動被中斷。而非中斷事件不會導致原始活動被中斷,活動保持不變。相反,會創建一個新的執行並發送給事件的傳出序列。
範例一(常見定時器用法)
💡 無須考慮吃飯的地點
中午11點,選購午餐訂購外送,如果同事挑選到12點都沒有選到合適的店家,那就直接走到公司隔壁的快餐店店裡吃午餐。
定時器事件流程範例1
(圖片來源:筆者自製,使用bpmn.io)
範例二(非中斷定時器用法)
已在公司為例,在開會前可以設定一個定時器,在開會前15分鐘,當時間到了就開始準備會議室,我們試著做做看這個案例。
定時器事件流程範例2
(圖片來源:筆者自製,使用bpmn.io)
訊息事件(Message Event)是引用指定訊息的事件(單向),而訊息(Message)是用來承載參與者雙方溝通的內容,訊息有名稱和有效負載(Payload)。
1.訊息開始事件
訊息開始事件通過訊息來啟動流程實例。這使得可以從一組可選的開始事件中選擇正確的開始事件。當部署具有一個或多個訊息開始事件的流程定義時,需考慮以下事項:
(1)訊息開始事件的名稱在給定的流程定義中必須是唯一的。若兩個或多個訊息開始事件引用同一訊息,或者引用同名的訊息,則在部署流程定義時引擎會拋出異常。
(2)在部署新版本的流程定義時,取消之前版本的訊息訂閱,對於新版本中不存在的訊息事件也是如此。一個流程可以有多種不同的訊息開始事件,以回應不同的訊息,最終選擇其中一種來啟動,這在某些情況下非常有用。
2.訊息中間捕獲事件
當令牌到達訊息中間捕獲事件時,在那裡等待,直到收到正確名稱的訊息為止。必須通過適當的API調用將訊息傳遞給流程引擎。
3.訊息邊界事件
邊界事件一般用於捕獲附加到活動邊界的事件。這意味著當活動運行時,訊息邊界事件將監聽其註冊的具名訊息。當捕獲到這種情況時,根據邊界事件的配置,可能會發生以下兩種情況。
(1)中斷型邊界事件:活動被中斷,並沿著離開事件的序列流繼續執行。
(2)非中斷型邊界事件:已有令牌繼續保留在活動中,同時創建新的令牌,新令牌沿著離開事件的序列流繼續執行。
4.訊息中間拋出事件
訊息中間拋出事件可以向外部服務發送訊息。此事件的行為與服務任務相同。
5.訊息結束事件
當流程執行到訊息結束事件時,當前的執行路徑將結束,並發送一則訊息。訊息結束事件的行為與服務任務相同。
範例一 、網購簡單情境(單向)
顧客在網上選購商品後下訂單,然後等待收貨通知。當顧客收到快遞送達的訊息後,便前去收貨。訊息中間事件也可能導致當前執行的事件被取消。
訊息事件流程範例1
(圖片來源:筆者自製,使用bpmn.io)
範例二、網購簡單情境(多向)
流程可以同時具有多種不同的訊息開始事件。
訊息事件流程範例2
(圖片來源:筆者自製,使用bpmn.io)
範例三、網購簡單情境(中間捕獲事件)
一個流程模型中可以包含中間捕獲事件,等待指令。
訊息事件流程範例3
(圖片來源:筆者自製,使用bpmn.io)
除了使用訊息中間捕獲事件外,可以與邊界事件結合使用,也可考慮使用接收任務實現類似業務目的。
範例四 、網購簡單情境(訊息邊界事件)
消息中間拋出事件「發送訂單郵件」,可以向外送服務發送消息,事件具有與服務任務相同的行為。
訊息事件流程範例4
(圖片來源:筆者自製,使用bpmn.io)
信號事件(Signal Event)是引用指定信號的事件,在流程中傳遞信號(Signal)時,會觸發信號事件。不同於消息,信號沒有特定的接收目標,信號就像是廣播電台的形式,一旦信號被廣播出去,多個參與者可以接收並觸發多個流程執行。
範例一、IG發文轉發
舉例來說,現在就像網紅MrBeast生日送錢,只要公開轉發限動就可以獲得抽獎資格,所以我們現在要來判斷自身的IG帳號是否可以發限動,如果可以我們就在相對應的位子進行轉發。
信號事件流程範例1
(圖片來源:筆者自製,使用bpmn.io)
💡 信號事件是引用特定信號的事件。信號是全局範圍的事件(廣播語義),並傳遞給所有活動的處理程序。
條件事件(Conditional Event)是在特定條件成立時觸發的事件,條件事件與流程獨立,因此只能捕獲事件,而且一個條件事件無法觸發另一個條件事件。
條件邊界事件
條件邊界事件的作用類似於觀察者:當特定條件滿足時將被觸發,默認為中斷事件,導致原始活動被中斷,而非中斷事件不中斷原始活動,實例仍處於活動狀態。相反地,系統會創建一個額外的執行路徑,以獲取事件的輸出轉換,只要連接的活動處於活動狀態,可以多次觸發非中斷條件事件。
中間條件捕捉事件
中間條件事件類似於等待,持續等待直至條件滿足。當執行到捕捉事件活動時,將開始評估條件。如果條件滿足,流程將繼續執行至下一個活動。如果條件不滿足,執行將停留在此活動中,直到條件滿足為止。
條件開始事件
條件開始事件可以透過評估某些條件來啟動流程。一個流程可以有一個或多個條件開始事件。如果滿足一個以上的條件,將觸發相應數量的流程。
事件子流程的條件開始事件
與條件邊界事件類似,事件子流程的條件開始事件可以是中斷型的,也可以是非中斷型的。
觸發條件事件
(1)作用域實例化時觸發。
(2)透過變數 API 觸發。
範例一、製作蛋糕烘烤階段
以烤箱製作蛋糕為例,不考慮蛋糕體前期準備過程,直接進入。第一步我們需要將烤箱預熱,當烤箱達到預熱溫度200度,放入蛋糕體進行烘焙,待12分鐘烘焙後,取出蛋糕,完成整個烘焙過程。
條件事件流程範例1
(圖片來源:筆者自製,使用bpmn.io)
條件事件定義了一個事件,在特定條件的評估結果為真時觸發該事件,可以用作事件子流程的開始事件(中斷/非中斷)、中間事件和邊界事件(中斷/非中斷)。
💡 在流程實例的整個執行過程中,可以取消流程。如果滿足條件開始事件的條件,則流程實例的執行將被事件子流程中斷,並取消當前處理中的流程。
錯誤事件(Error Event),在任何流程中,都可能出現意外狀況,我們可以在設計流程時,先考慮可能出現的錯誤情況,然後採取適當的措施來處理。另外,我們也可以選擇將錯誤事件升級,交由上層系統來處理。
升級事件(Escalation Events)就如其名,是指涉及已命名升級(Escalation)的事件。主要用於子流程與上層流程之間的溝通。與錯誤事件不同,升級事件並非關鍵事件,它會在拋出的位置繼續執行。
取消事件(Cancel Events)只在建模交易子流程時使用,有兩種變體:捕獲中間事件和結束事件。
補償事件(Compensation Events)包括中間拋出補償事件、補償結束事件和補償邊界事件,用於執行特定活動或範圍的補償。
連結事件(Link Events)不具有特定的執行語義,僅被視為指向同一流程模型(在同一子流程中)中另一個節點的「前往」語句。因此,我們可以將兩個相符的連結視為序列流的替代方式。連結事件的概念就像是一個「跳轉至」指令,讓流程可以流向同一子流程中的另一個位置。
終止事件(Terminate Event)在某些情況下十分實用,當我們需要同時執行多個任務,但其中一個任務完成後,其他同時執行的任務便可停止。這時候,我們可以引入「終止事件」來達成目的。
由於篇幅的關係,筆者僅寫入部分事件,如果想要看到更完整的內容,詳細請參見:[Business Process Model and Notation(BPMN)](https://www.omg.org/spec/BPMN/2.0/PDF)
所提到的事件,主要根據其觸發方式進行分類。BPMN 2.0 也從另一個角度對事件進行區分。例如,開始事件只能對觸發器作出回應,也就是捕捉(Catch)一個(觸發的)事件。相反地,結束事件只能帶來一個結果,或者說拋出(Throw)一個(異常的)結果。然而,對於中間事件,既可以觸發,也可以捕捉另一個觸發器事件。根據這個特性,可以組合出許多錯綜複雜的事件。
(圖片來源:Business Process Model and Notation(BPMN))P261
我們現在已經知道在BPMN中的事件,恭喜您對BPMN有「事件」的運用有所了解,明天我們再利用一些認識BPMN中的「任務」,我們一起加油吧~~
💡 如果有任何問題,歡迎在下方留言!! 筆者頭一回寫技術文,如果內容有誤,或者內容的呈現上有所缺陷,如果您願意,歡迎在下方留言給我呦~~
這是我的部落格,歡迎點擊閱覽喔~~會不定期更新文章